package snailAI.Utils;

import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;


import java.util.concurrent.TimeUnit;

/**
 * Redis 工具类：封装存Key、读Key核心方法
 * 依赖 Spring 配置的 RedisTemplate（Jedis 客户端、JSON序列化）
 */
@Component
public class RedisUtils {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;



    /**
     * 1. 存 Key-Value（无过期时间，永久有效）
     * @param key 键（不可为null）
     * @param value 值（可存字符串、实体类、集合等，会自动JSON序列化）
     * @return 存储成功返回true，失败返回false
     */
    public boolean set(String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            // 捕获Redis连接异常、序列化异常等，避免影响主流程
            e.printStackTrace();
            return false;
        }
    }


    /**
     * 2. 存 Key-Value（带过期时间，满足临时缓存场景：如验证码10分钟过期）
     * @param key 键（不可为null）
     * @param value 值（可存字符串、实体类等）
     * @param expireTime 过期时间（数值）
     * @param timeUnit 时间单位（如 TimeUnit.MINUTES 表示分钟，TimeUnit.SECONDS 表示秒）
     * @return 存储成功返回true，失败返回false
     */
    public boolean setWithExpire(String key, Object value, long expireTime, TimeUnit timeUnit) {
        try {
            redisTemplate.opsForValue().set(key, value, expireTime, timeUnit);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


    /**
     * 3. 读 Key 对应的 Value
     * @param key 键（不可为null）
     * @return 存在则返回Value（自动反序列化为原类型），不存在返回null
     */
    public Object get(String key) {
        try {
            // 若key不存在，RedisTemplate会返回null，无需额外判断
            return redisTemplate.opsForValue().get(key);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 4. 额外封装：删除Key（可选，方便后续扩展）
     * @param key 键
     * @return 删除成功返回true，失败/key不存在返回false
     */
    public boolean delete(String key) {
        try {
            return Boolean.TRUE.equals(redisTemplate.delete(key));
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    public Long addMessageToList(String key, Object message) {
        try {
            // 向列表尾部添加消息，返回添加后列表的长度
            return redisTemplate.opsForList().rightPush(key, message);
        } catch (Exception e) {
            e.printStackTrace();
            return -1L; // 失败返回-1
        }
    }
    public java.util.List<Object> getMessageList(String key, long start, long end) {
        try {
            return redisTemplate.opsForList().range(key, start, end);
        } catch (Exception e) {
            e.printStackTrace();
            return java.util.Collections.emptyList(); // 失败返回空列表
        }
    }
    public java.util.List<Object> getMessageList(String key) {
        //默认获取全部。
        try {
            return redisTemplate.opsForList().range(key, 0, -1);
        } catch (Exception e) {
            e.printStackTrace();
            return java.util.Collections.emptyList(); // 失败返回空列表
        }
    }



}